#ifndef GENETICO_H
#define GENETICO_H

   #include <iostream>
   #include <fstream>
   #include <string>
   #include <list>
   #include <algorithm>
   #include <cstdlib> 
   #include <ctime> 
   #include "rectangulo.h"
   #include "heuristica.h"
   #include "contenedor.h"
   #include "solucion.h"
   
      using namespace std;
       class Genetico : public Heuristica{
	 protected: 
	   int N;
	   double new_media, media; // Guardamos la calidad media de la población.
	   vector <Solucion> Individuo, Nueva_generacion;
	   vector <double> p; //Probabilidades de las soluciones
	   Contenedor C;
	 public:
	 /**
         * Constructor por defecto. 
         * En principio no se usa.
         * */
         Genetico();

         /** Constructor
         * @param listado de los rectángulos a empaquetar
         * */
         Genetico(list<Rectangulo> lista_in, Contenedor & C_);
         void generar_probabilidades ();
         int elegido ();
         void reset_marca();
         bool parada(int valor);
         /** 
         * Generar solución inicial 
         * Mecanismo de generación de soluciones iniciales
         * • Soluciones generadas aleatoriamente
         * • GRASP
         * • Soluciones distantes de los óptimos locales previamente encontrados
         * */
         list<Rectangulo> generaInicial();
         /** 
         * Modificar la solución 
         * 
         * • Búsqueda local
         * • Estructura de entorno
         * • Muestreo en el entorno
         * */
          list<Rectangulo> mejoraSolucion();
	 
	 ~Genetico(){}
       };
 #endif
